#include <iostream>
using std::cout;
using std::endl;

class Point
{
public:
    Point()
    : _ix(0)
    , _iy(0)
    {
        cout << "Point()" << endl;
    }

    Point(int x,int y = 1)
    : _ix(x)
    , _iy(y)
    {
        cout << "Point(int,int)" << endl;
    }

    Point(const Point & rhs)
    : _ix(rhs._ix)
    , _iy(rhs._iy)
    {
        cout << "拷贝构造" << endl;
    }

    void print(){
        cout << "(" << _ix
            << "," << _iy
            << ")" << endl;
    }
private:
    int _ix;
    int _iy;
};

void test0(){
    Point pt(30,50);
    //第一种调用时机
    //利用一个已经存在的Point对象
    //用复制的方式创建一个新的Point对象
    //调用拷贝构造完成新对象的数据成员的初始化
    Point pt2 = pt;
    pt2.print();
}

#if 0
void fu(int x){
    x = 10;
    cout << x << endl;
}

void test(){
    int num = 100;
    fu(num);
    cout << num << endl;
}
#endif

//第二种调用时机
//值传递
//当函数的实参和形参都是对象时
//实参初始化形参的过程也会调用拷贝构造
//
//为了避免这种多余的复制
//可以给函数参数写成引用形式
/* void func(Point & p){ */
void func(Point p){
    p.print();
}

void test1(){
    Point pt(4,9);
    func(pt);
}

#if 0
int fu2(){
    int num = 2;
    return num;
}
#endif

//第三种调用时机
//当函数的返回值是对象时
//执行return语句会调用拷贝构造
//
//想要避免这次复制可以将返回值写为引用
//但是要确保返回的引用所绑定的对象
//生命周期比函数更长
Point pp(5,8);

/* Point & func2(){ */
Point func2(){
    return pp;
}

void test2(){
    func2().print();
}


int main(void){
    test2();
    return 0;
}
